﻿namespace Sage.MarkdownRenderer.Html
{
    /// <summary>
    /// HTML 模板配置类
    /// 用于配置 HTML 模板生成器的各种参数和行为
    /// </summary>
    public class HtmlTemplateConfig
    {
        #region 基础内容配置

        /// <summary>
        /// 页面标题
        /// 设置 HTML 页面的 title 标签内容，同时用于欢迎页面的主标题显示
        /// 默认值: ""（空字符串）
        /// </summary>
        public string Title { get; set; } = "";

        /// <summary>
        /// 页面主体内容
        /// 包含要显示的 HTML 内容，通常是经过 Markdown 转换后的 HTML 字符串
        /// 默认值: ""（空字符串）
        /// </summary>
        public string Content { get; set; } = "";

        /// <summary>
        /// 是否显示欢迎页面布局
        /// true: 内容将被包装在居中的欢迎容器中，适用于欢迎页面或提示页面
        /// false: 内容直接显示，适用于正常的文档内容
        /// 默认值: false
        /// </summary>
        public bool ShowWelcomeLayout { get; set; } = false;

        #endregion

        #region 主题和外观配置

        /// <summary>
        /// 主题模式
        /// Light: 浅色主题（白色背景，深色文字）
        /// Dark: 深色主题（深色背景，浅色文字）
        /// Auto: 自动主题（跟随系统设置）
        /// 默认值: ThemeMode.Light
        /// </summary>
        public ThemeMode Theme { get; set; } = ThemeMode.Light;

        /// <summary>
        /// 字体族设置
        /// 定义页面使用的字体，支持多个字体的降级序列
        /// 建议包含系统字体以确保兼容性
        /// 默认值: "Microsoft YaHei, -apple-system, BlinkMacSystemFont, Segoe UI, Arial, sans-serif"
        /// </summary>
        public string FontFamily { get; set; } = "Microsoft YaHei, -apple-system, BlinkMacSystemFont, Segoe UI, Arial, sans-serif";

        /// <summary>
        /// 基础字体大小（像素）
        /// 设置页面的基础字体大小，其他元素会基于此大小进行缩放
        /// 建议范围: 12-18 像素
        /// 默认值: 14
        /// </summary>
        public int FontSize { get; set; } = 14;

        /// <summary>
        /// 最大宽度限制（像素）
        /// 限制内容的最大宽度，提高长文本的阅读体验
        /// 0: 不限制宽度，内容占满容器
        /// >0: 设置具体的最大宽度值，内容会居中显示
        /// 建议值: 800-1200 像素
        /// 默认值: 0（不限制）
        /// </summary>
        public int MaxWidth { get; set; } = 0; // 0 表示不限制

        /// <summary>
        /// 自定义颜色配置
        /// 允许用户自定义各种元素的颜色
        /// 默认值: null（使用主题默认颜色）
        /// </summary>
        public ColorConfig? ColorConfig { get; set; }
        #endregion

        #region 交互和行为配置

        /// <summary>
        /// 是否显示滚动条
        /// true: 显示标准滚动条，用户可以滚动查看内容
        /// false: 隐藏滚动条，适用于固定高度的嵌入式显示
        /// 默认值: true
        /// </summary>
        public bool ShowScrollbar { get; set; } = true;

        /// <summary>
        /// 是否启用动画效果
        /// true: 启用页面元素的进入动画和过渡效果
        /// false: 禁用所有动画，提供更快的加载体验
        /// 注意: 禁用此选项不会影响 CSS transition，只影响 keyframe 动画
        /// 默认值: true
        /// </summary>
        public bool EnableAnimation { get; set; } = true;

        /// <summary>
        /// 是否启用悬停动画
        /// true: 鼠标悬停在标题等元素上时显示动画效果
        /// false: 禁用悬停动画，减少干扰
        /// 注意: 此选项只在 EnableAnimation 为 true 时生效
        /// 默认值: true
        /// </summary>
        public bool EnableHoverAnimations { get; set; } = true; // 新增：控制悬停动画

        /// <summary>
        /// 是否启用代码复制功能
        /// true: 在代码块上显示复制按钮，用户可以一键复制代码
        /// false: 不显示复制按钮，代码块为纯显示模式
        /// 注意: 复制功能需要浏览器支持 Clipboard API 或 execCommand
        /// 默认值: true
        /// </summary>
        public bool EnableCodeCopy { get; set; } = true;

        #endregion

        #region 功能开关配置

        /// <summary>
        /// 是否启用打印样式
        /// true: 包含专门的打印样式，优化打印效果
        /// false: 不包含打印样式，减少 CSS 体积
        /// 打印样式会调整颜色、字体大小、分页等以适应打印需求
        /// 默认值: true
        /// </summary>
        public bool EnablePrintStyles { get; set; } = true;

        /// <summary>
        /// 是否启用响应式设计
        /// true: 包含响应式 CSS，适配不同屏幕尺寸（手机、平板、桌面）
        /// false: 不包含响应式样式，使用固定布局
        /// 建议在移动设备上使用时保持启用
        /// 默认值: true
        /// </summary>
        public bool EnableResponsive { get; set; } = true;

        #endregion

        #region 自定义扩展配置

        /// <summary>
        /// 自定义 CSS 样式
        /// 允许注入自定义的 CSS 代码来覆盖或扩展默认样式
        /// 这些样式会在所有默认样式之后应用，具有更高的优先级
        /// 示例: ".my-class { color: red; font-weight: bold; }"
        /// 默认值: ""（空字符串）
        /// </summary>
        public string CustomCss { get; set; } = "";

        #endregion

        #region 配置验证方法

        /// <summary>
        /// 验证配置参数的有效性
        /// </summary>
        /// <returns>返回验证结果和错误信息</returns>
        public (bool IsValid, string ErrorMessage) Validate()
        {
            // 验证字体大小
            if (FontSize < 8 || FontSize > 32)
            {
                return (false, "字体大小必须在 8-32 像素之间");
            }

            // 验证最大宽度
            if (MaxWidth < 0)
            {
                return (false, "最大宽度不能为负数");
            }

            // 验证字体族不为空
            if (string.IsNullOrWhiteSpace(FontFamily))
            {
                return (false, "字体族不能为空");
            }

            return (true, string.Empty);
        }

        #endregion

        #region 预定义配置

        /// <summary>
        /// 获取默认的 Markdown 预览配置
        /// 适用于一般的 Markdown 文档预览
        /// </summary>
        /// <returns>预配置的 HtmlTemplateConfig 实例</returns>
        public static HtmlTemplateConfig GetMarkdownPreviewConfig()
        {
            return new HtmlTemplateConfig
            {
                Theme = ThemeMode.Light,
                FontSize = 15,
                MaxWidth = 1000,
                EnableAnimation = true,
                EnableHoverAnimations = false, // 文档阅读时减少干扰
                EnableCodeCopy = true,
                EnableResponsive = true,
                EnablePrintStyles = true
            };
        }

        /// <summary>
        /// 获取适合移动设备的配置
        /// 优化移动设备的显示效果
        /// </summary>
        /// <returns>预配置的 HtmlTemplateConfig 实例</returns>
        public static HtmlTemplateConfig GetMobileConfig()
        {
            return new HtmlTemplateConfig
            {
                Theme = ThemeMode.Auto,
                FontSize = 16, // 移动设备使用较大字体
                MaxWidth = 0, // 移动设备不限制宽度
                EnableAnimation = false, // 移动设备禁用动画以提高性能
                EnableHoverAnimations = false,
                EnableCodeCopy = true,
                EnableResponsive = true,
                EnablePrintStyles = false // 移动设备通常不需要打印样式
            };
        }

        /// <summary>
        /// 获取适合打印的配置
        /// 优化打印输出效果
        /// </summary>
        /// <returns>预配置的 HtmlTemplateConfig 实例</returns>
        public static HtmlTemplateConfig GetPrintConfig()
        {
            return new HtmlTemplateConfig
            {
                Theme = ThemeMode.Light, // 打印使用浅色主题
                FontSize = 12,
                MaxWidth = 0,
                EnableAnimation = false, // 打印不需要动画
                EnableHoverAnimations = false,
                EnableCodeCopy = false, // 打印不需要交互功能
                EnableResponsive = false, // 打印使用固定布局
                EnablePrintStyles = true,
                ShowScrollbar = false // 打印不需要滚动条
            };
        }

        /// <summary>
        /// 获取高性能配置
        /// 禁用所有可能影响性能的功能
        /// </summary>
        /// <returns>预配置的 HtmlTemplateConfig 实例</returns>
        public static HtmlTemplateConfig GetPerformanceConfig()
        {
            return new HtmlTemplateConfig
            {
                Theme = ThemeMode.Light,
                FontSize = 14,
                MaxWidth = 0,
                EnableAnimation = false,
                EnableHoverAnimations = false,
                EnableCodeCopy = false,
                EnableResponsive = false,
                EnablePrintStyles = false,
                CustomCss = "" // 不使用自定义样式以减少解析时间
            };
        }

        #endregion

        #region 辅助方法

        /// <summary>
        /// 创建当前配置的深度副本
        /// </summary>
        /// <returns>新的 HtmlTemplateConfig 实例</returns>
        public HtmlTemplateConfig Clone()
        {
            return new HtmlTemplateConfig
            {
                Title = Title,
                Content = Content,
                ShowWelcomeLayout = ShowWelcomeLayout,
                Theme = Theme,
                FontFamily = FontFamily,
                FontSize = FontSize,
                ShowScrollbar = ShowScrollbar,
                CustomCss = CustomCss,
                EnablePrintStyles = EnablePrintStyles,
                EnableResponsive = EnableResponsive,
                EnableAnimation = EnableAnimation,
                EnableHoverAnimations = EnableHoverAnimations,
                EnableCodeCopy = EnableCodeCopy,
                MaxWidth = MaxWidth
            };
        }

        /// <summary>
        /// 重写 ToString 方法，提供配置的简要描述
        /// </summary>
        /// <returns>配置的字符串表示</returns>
        public override string ToString()
        {
            return $"HtmlTemplateConfig: Theme={Theme}, FontSize={FontSize}px, MaxWidth={MaxWidth}px, " +
                   $"Animation={EnableAnimation}, CodeCopy={EnableCodeCopy}, Responsive={EnableResponsive}";
        }

        #endregion
    }
}
